package zdream.control.region;

import java.util.Arrays;
import java.util.Objects;

/**
 * <p>区域. 一个区域由多个房间组成, 而多个区域可以作为一个关卡.
 * <p>每个区域可以由多个 TMX 文件定义, 而它们可能需要进行拼接工作,
 * 在系统加载时合并成一张大的地图.
 * </p>
 *
 * @author Zdream
 * @since 0.0.1
 * @date
 *   2019-05-12 (last modified)
 */
public class Region {
	public static int BLOCK_WIDTH = 25;
	public static int BLOCK_HEIGHT = 14;

	/**
	 * 包内生成
	 */
	public Region(String name) {
		this.name = Objects.requireNonNull(name);
	}

	/**
	 * 名称
	 */
	public final String name;

	/**
	 * 房间数
	 */
	public Room[] rooms;

	/**
	 * 兴趣点 (原中继点位)
	 * key: 中继点的名称, 来源于 tmx 文件
	 * value: 长度为 3 的 int 数组, [0] 是 room 号码, [1] 和 [2] 是在那个房间的相对位置, x 和 y
	 */
	public InterestPoint[] points;

	public InterestPoint findPoint(String name) {
		return Arrays.stream(points)
				.filter(point -> point.name.equals(name))
				.findAny()
				.orElse(null);
	}

	public Room findRoom(int roomId) {
		return Arrays.stream(rooms)
				.filter(room -> room.id == roomId)
				.findAny()
				.orElse(null);
	}

	/**
	 * 查看这个点在哪个房间中
	 * @param x 相对于整个 tmx 的横坐标
	 * @param y 相对于整个 tmx 的纵坐标
	 */
	public Room of(int x, int y) {
		for (Room r : rooms) {
			if (r.contain(x, y)) {
				return r;
			}
		}
		return null;
	}

	/**
	 * 查看这个点在哪个房间中
	 * @param x 相对于整个 tmx 的横坐标
	 * @param y 相对于整个 tmx 的纵坐标
	 */
	public Room of(float x, float y) {
		for (Room r : rooms) {
			if (r.contain(x, y)) {
				return r;
			}
		}
		return null;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + name.hashCode();
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Region other = (Region) obj;
		return name.equals(other.name);
	}

	@Override
	public String toString() {
		return String.format("Region:%s", name);
	}

	public static RegionBuilder builder(String name) {
		return new RegionBuilder(name);
	}
}

